/**
 *  CMS图片处理工具类
 *  调用方式：picUtils.方法名
 */
var picUtils = {
    /**
     *  图片上传
     *  ============================================================================================
     *  入参：
     *      type            【类型，0表示普通图片上传，1表示富文本上传图片】
     *      option          【type=0时，只需要btn_id，ul_id，max_file_count参数】
     *                              btn_id          【上传按钮元素ID】
     *                              ul_id           【回显图片缩略图的ul元素ID】
     *                              max_file_count  【最大文件数限制】
     *                      【type=1时，只需要editor参数】
     *                              editor          【wangEditor对象】
     *  ============================================================================================
     */
    uploadInit: function (type, option) {
        var config = {
            runtimes: 'html5,flash,html4',//上传模式,依次退化
            uptoken_url: '/cms/sysManage/fileToken',//Ajax请求upToken的Url，**强烈建议设置**（服务端提供）
            unique_names: true,// 默认false，key为文件名。若开启该选项，SDK为自动生成上传成功后的key（文件名）
            domain: 'http://mousejerry-cn-idvadb5.qiniudns.com/',//bucket 域名，下载资源时用到，**必需**
            get_new_uptoken: true,//设置上传文件的时候是否每次都重新获取新的token
            flash_swf_url: '/piger/support/plugins/plupload-2.3.6/js/Moxie.swf',//引入flash,相对路径
            max_retries: 10,//上传失败最大重试次数
            chunk_size: '5mb',//分块上传时，每片的体积
            auto_start: true,//选择文件后自动上传，若关闭需要自己绑定事件触发上传
            multi_selection: (option.max_file_count > 1) ? true : false,//是否允许多选
            disable_statistics_report: true,//关闭七牛在浏览器console的错误输出日志
            filters: {
                mime_types: [{
                    title: 'Image files',
                    extensions: 'jpg,jpeg,png'
                }],
                max_file_size: '10mb',//最大文件体积限制
                prevent_duplicates: true//不允许选取重复文件
            },
            init: {
                Error: function (uploader, error) {
                    // 上传出错时，处理相关的事情
                    switch (error.code) {
                        case -600:
                            layer.msg('文件【' + error.file.name + '】大小为' + (error.file.origSize / 1024 / 1024).toFixed(2) + 'MB，已经超过最大限制10MB！', {
                                anim: 6,
                                time: 6000
                            });
                            break;
                        case -601:
                            layer.msg('文件【' + error.file.name + '】类型不对，系统只允许上传JPG/JPEG/PNG类型的文件！', {
                                anim: 6,
                                time: 6000
                            });
                            break;
                        case -602:
                            layer.msg('文件【' + error.file.name + '】已存在，系统不允许选择重复文件！', {anim: 6, time: 6000});
                            break;
                        default:
                            layer.msg(error.message, {anim: 6});
                            break;
                    }
                }
            }
        }
        switch (type) {
            case 0:
                config.browse_button = option.btn_id;//上传选择的点选按钮，**必需**
                config.init.FilesAdded = function (uploader, files) {
                    var file_count = $('#' + option.ul_id)[0].children.length;
                    if ((files.length + file_count) > option.max_file_count) {
                        var temp_files = JSON.parse(JSON.stringify(files));
                        $.each(temp_files, function (file_index, file_item) {
                            if ((file_count + file_index + 1) > option.max_file_count) {
                                uploader.removeFile(file_item);
                            }
                        });
                        layer.msg('当前已上传' + file_count + '个文件，系统最多允许上传' + option.max_file_count + '个文件，还剩' + (option.max_file_count - file_count) + '个可以上传！', {
                            anim: 6,
                            time: 6000
                        });
                    }
                }
                config.init.FileUploaded = function (uploader, file, responseObject) {
                    var domain = uploader.getOption('domain');
                    var response = $.parseJSON(responseObject.response);
                    var source_url = domain + response.key;
                    var pics = new Array();
                    pics.push(source_url);
                    picUtils.initPicBox(option.ul_id, pics, false, ((option.max_file_count > 1) ? false : true), uploader, file);
                }
                break;
            case 1:
                config.browse_button = option.editor.imgMenuId;//上传选择的点选按钮，**必需**
                config.init.FileUploaded = function (uploader, file, responseObject) {
                    var domain = uploader.getOption('domain');
                    var response = $.parseJSON(responseObject.response);
                    var source_url = domain + response.key;
                    option.editor.cmd.do('insertHtml', '<img src="' + source_url + '" style="max-width: 100%;">');
                }
                break;
            default:
                break;
        }
        Qiniu.uploader(config);
    },
    /**
     *  图片上传
     *  ============================================================================================
     *  入参：
     *      type            【类型，0表示普通图片上传，1表示富文本上传图片】
     *      option          【type=0时，只需要btn_id，ul_id，max_file_count，max_file_size参数】
     *                              btn_id          【上传按钮元素ID】
     *                              ul_id           【回显图片缩略图的ul元素ID】
     *                              max_file_count  【最大文件数限制】
     *                      【type=1时，只需要editor参数】
     *                              editor          【wangEditor对象】
     *  ============================================================================================
     */
    uploadImageSizeInit: function (type, option) {
        var config = {
            runtimes: 'html5,flash,html4',//上传模式,依次退化
            uptoken_url: '/cms/fileToken',//Ajax请求upToken的Url，**强烈建议设置**（服务端提供）
            unique_names: true,// 默认false，key为文件名。若开启该选项，SDK为自动生成上传成功后的key（文件名）
            domain: login_user_infos.user_sys_def.qiniuBaseUrl,//bucket 域名，下载资源时用到，**必需**
            get_new_uptoken: true,//设置上传文件的时候是否每次都重新获取新的token
            flash_swf_url: '/piger/support/plugins/plupload-2.3.6/js/Moxie.swf',//引入flash,相对路径
            max_retries: 10,//上传失败最大重试次数
            chunk_size: '5mb',//分块上传时，每片的体积
            auto_start: true,//选择文件后自动上传，若关闭需要自己绑定事件触发上传
            multi_selection: (option.max_file_count > 1) ? true : false,//是否允许多选
            disable_statistics_report: true,//关闭七牛在浏览器console的错误输出日志
            filters: {
                mime_types: [{
                    title: 'Image files',
                    extensions: 'jpg,jpeg,png'
                }],
                max_file_size: option.max_file_size + 'mb',//最大文件体积限制
                prevent_duplicates: true//不允许选取重复文件
            },
            init: {
                Error: function (uploader, error) {
                    // 上传出错时，处理相关的事情
                    switch (error.code) {
                        case -600:
                            layer.msg('文件【' + error.file.name + '】大小为' + (error.file.origSize / 1024 / 1024).toFixed(2) + 'MB，已经超过最大限制10MB！', {
                                anim: 6,
                                time: 6000
                            });
                            break;
                        case -601:
                            layer.msg('文件【' + error.file.name + '】类型不对，系统只允许上传JPG/JPEG/PNG类型的文件！', {
                                anim: 6,
                                time: 6000
                            });
                            break;
                        case -602:
                            layer.msg('文件【' + error.file.name + '】已存在，系统不允许选择重复文件！', {anim: 6, time: 6000});
                            break;
                        default:
                            layer.msg(error.message, {anim: 6});
                            break;
                    }
                }
            }
        }
        switch (type) {
            case 0:
                config.browse_button = option.btn_id;//上传选择的点选按钮，**必需**
                config.init.FilesAdded = function (uploader, files) {
                    var file_count = $('#' + option.ul_id)[0].children.length;
                    if ((files.length + file_count) > option.max_file_count) {
                        var temp_files = JSON.parse(JSON.stringify(files));
                        $.each(temp_files, function (file_index, file_item) {
                            if ((file_count + file_index + 1) > option.max_file_count) {
                                uploader.removeFile(file_item);
                            }
                        });
                        layer.msg('当前已上传' + file_count + '个文件，系统最多允许上传' + option.max_file_count + '个文件，还剩' + (option.max_file_count - file_count) + '个可以上传！', {
                            anim: 6,
                            time: 6000
                        });
                    }
                }
                config.init.FileUploaded = function (uploader, file, responseObject) {
                    var domain = uploader.getOption('domain');
                    var response = $.parseJSON(responseObject.response);
                    var source_url = domain + response.key;
                    var pics = new Array();
                    pics.push(source_url);
                    picUtils.initPicBox(option.ul_id, pics, false, ((option.max_file_count > 1) ? false : true), uploader, file);
                }
                break;
            case 1:
                config.browse_button = option.editor.imgMenuId;//上传选择的点选按钮，**必需**
                config.init.FileUploaded = function (uploader, file, responseObject) {
                    var domain = uploader.getOption('domain');
                    var response = $.parseJSON(responseObject.response);
                    var source_url = domain + response.key;
                    option.editor.cmd.do('insertHtml', '<img src="' + source_url + '" style="max-width: 100%;">');
                }
                break;
            default:
                break;
        }
        Qiniu.uploader(config);
    },
    /**
     *  图片框初始化
     *  ============================================================================================
     *  入参：
     *      ul_id           【回显图片缩略图的ul元素ID】
     *      pics            【图片链接地址的数组】
     *      isView          【是否查看模式，true表示查看模式，false表示传图模式】
     *      isSingle        【是否单图上传，true表示单图上传，false表示多图上传】
     *      uploader        【Plupload实例，非必须，可传空或null】
     *      file            【上传的文件实例，非必须，可传空或null】
     *  ============================================================================================
     */
    initPicBox: function (ul_id, pics, isView, isSingle, uploader, file) {
        if (isSingle) {
            $('#' + ul_id).empty();
        }
        $.each(pics, function (pics_index, pics_item) {
            var index = $('#' + ul_id)[0].children.length - 1;
            $('#' + ul_id).append(
                '<li id="' + ul_id + '-li-' + index + '" class="cms-picBox-li">' +
                '<img class="cms-picBox-img" src="' + pics_item + '">' +
                (!isView ? '<i id="' + ul_id + '-i-' + index + '" class="cms-picBox-li-remove"></i>' : '') +
                '</li>'
            );
            if (!isView) {
                $('#' + ul_id + '-i-' + index).click(function () {
                    $('#' + ul_id + '-li-' + index).remove();
                    if (uploader && file) {
                        uploader.removeFile(file);
                    }
                });
            }
        });
        var viewer = new Viewer($('#' + ul_id)[0].parentElement);
        $('#' + ul_id)[0].parentElement.onclick = function (event) {
            if (event.target.className != 'cms-picBox-li-remove') {
                viewer.show();
            }
        }
    },
    /**
     *  获取图片框里的所有图片
     *  ============================================================================================
     *  入参：
     *      ul_id           【回显图片缩略图的ul元素ID】
     *  出参：
     *      pics_array      【图片链接地址的数组】
     *  ============================================================================================
     */
    getPicsFromPicBox: function (ul_id) {
        var pics_array = new Array();
        $.each($('#' + ul_id).find('img'), function (index, item) {
            pics_array.push(item.src);
        });
        return pics_array;
    },
    /**
     *  获取所有
     *  ============================================================================================
     *  入参：
     *      ul_id           【回显图片缩略图的ul元素ID】
     *  出参：
     *      pics_array      【图片链接地址的数组】
     *  ============================================================================================
     */
    getFileFromPicBox: function (ul_id) {
        var pics_array = [];
        $.each($('#' + ul_id).find('img'), function (index, item) {
            var $item = $(item);
            pics_array.push($item.data('href') ? $item.data('href') : $item.src);
        });
        return pics_array;
    },
    /**
     *  清除图片框里的所有图片
     *  ============================================================================================
     *  入参：
     *      ul_id           【回显图片缩略图的ul元素ID】
     *  ============================================================================================
     */
    clearPicBox: function (ul_id) {
        $('#' + ul_id).empty();
    },
    /**
     *  图片框初始化，该初始化方法会在图片下方显示文字描述
     *  ============================================================================================
     *  入参：
     *      ul_id           【回显图片缩略图的ul元素ID】
     *      imageArr           【对象数据，存有图片和图片描述文字】
     *  ============================================================================================
     */
    renderImageAndMsgBox: function (ul_id, imageArr) {
        var $imgUl = $('#' + ul_id);
        if (!imageArr) {
            return;
        }
        if (imageArr.length === 0) {
            return;
        }
        $.each(imageArr, function (pics_index, pics_item) {
            var li = '';
            $.each(pics_item, function (index, item) {
                if (item.image) {
                    var style = '';
                    if (item.modify) {
                        style = 'style="border: 2px solid red;"';
                    }
                    li += '<li class="cms-picBox-li">' +
                        '<div >' +
                        '<img class="cms-picBox-img" src="' + item.image + '" '+style+'>' +
                        '</div>' +
                        '<div>' +
                        '<span>' + item.desc + '</span>' +
                        '</div>' +
                        '</li>';
                }
            });
            if (li) {
                $imgUl.append(li);
            }
        });
        var viewer = new Viewer($imgUl[0].parentElement);
        $imgUl[0].parentElement.onclick = function (event) {
            viewer.show();
        }
    },
    /**
     *  两组图片对比,新增图片高亮显示
     *  ============================================================================================
     *  入参：
     *      ul_id           【回显图片缩略图的ul元素ID】
     *      pics1            【最新图片数据数组】
     *      pics2            【历史图片数据数组】
     *  ============================================================================================
     */
    initChangePicBox: function (ul_id, pics1, pics2) {
        //还未驳回时,此时pics2为空
        if (pics1.length != 0 && pics2.length === 0) {
            $.each(pics1, function (pics_index, pics_item) {
                var index = $('#' + ul_id)[0].children.length - 1;
                $('#' + ul_id).append(
                    '<li id="' + ul_id + '-li-' + index + '" class="cms-picBox-li">' +
                    '<img class="cms-picBox-img" src="' + pics_item + '">' +
                    '</li>'
                );
            });
        }
        if (pics1.length != 0 && pics2.length != 0) {
            var picSame = this.sameArray(pics1, pics2);
            $.each(picSame, function (pics_index, pics_item) {
                var index = $('#' + ul_id)[0].children.length - 1;
                $('#' + ul_id).append(
                    '<li id="' + ul_id + '-li-' + index + '" class="cms-picBox-li">' +
                    '<img class="cms-picBox-img" src="' + pics_item + '">' +
                    '</li>'
                );
            });
            var picDiff = this.difference(pics1, pics2);
            $.each(picDiff, function (pics_index, pics_item) {
                var index = $('#' + ul_id)[0].children.length - 1;
                $('#' + ul_id).append(
                    '<li id="' + ul_id + '-li-' + index + '" class="cms-picBox-li">' +
                    '<img class="cms-picBox-img" src="' + pics_item + '" style="border:6px solid #ff0000">' +
                    '</li>'
                );
            });
        }
        var viewer = new Viewer($('#' + ul_id)[0].parentElement);
        $('#' + ul_id)[0].parentElement.onclick = function (event) {
            if (event.target.className != 'cms-picBox-li-remove') {
                viewer.show();
            }
        }
    },
    /**
     * 返回arr1中不同于arr2中的元素
     * @param arr1
     * @param arr2
     * @returns {*}
     */
    difference: function diff(arr1, arr2) {
        for (var i = 0; i < arr2.length; i++) {
            for (var j = 0; j < arr1.length; j++) {
                if (arr1[j] === arr2[i]) {
                    arr1.splice(j, 1);
                    j = j - 1;
                }
            }
        }
        return arr1;
    },
    /**
     * 返回arr1与arr2相同的元素
     * @param arr1
     * @param arr2
     * @returns {Array}
     */
    sameArray: function same(arr1, arr2) {
        //连接两数组中的元素
        var item = arr1.concat(arr2);
        //进行排序，使用系统的元素排列在一起
        item.sort();
        //存储两个数组相同元素的数组
        var sameDataArray = [];
        //从第二个元素开始遍历数组,与前者比较
        for (var i = 1; i < item.length; i++) {
            //判断与前面的元素是否相同，且是否已经保存到sameDataArray数组了
            if (item[i] === item[i - 1] && sameDataArray[sameDataArray.length - 1] != item[i]) {
                sameDataArray.push(item[i]);//添加两个数组相同的元素
            }
        }
        return sameDataArray;
    }
}